W poniższej pracy dokonam eksploracyjnej analizy danych na zestawie pochodzącym ze strony https://www.kaggle.com/datasets/paradisejoy/top-hits-spotify-from-20002019/data. Dane przedstawiają statystyki dotyczące najczęściej pojawiających się utworów w najpopularniejszych playlistach serwisu Spotify w latach 1999-2019. W celu dogłębnej analizy posłużę się licznymi statystykami opisowymi oraz odpowiednimi wizualizacjami. Na samym początku załadujmy pakiety, których funkcje pozwolą na przeprowadzenie poszczególnych operacji na przygotowanym zestawie danych.
library(dplyr)
library(ggplot2)
library(mice)
library(plotly)
library(corrplot)
library(RColorBrewer)Po wczytaniu pakietów, możemy przystąpić do obejrzenia zawartości danych i weryfikacji ewentualnych braków danych:
## 'data.frame': 2000 obs. of 18 variables:
## $ artist : chr "Britney Spears" "blink-182" "Faith Hill" "Bon Jovi" ...
## $ song : chr "Oops!...I Did It Again" "All The Small Things" "Breathe" "It's My Life" ...
## $ duration_ms : int 211160 167066 250546 224493 200560 253733 284200 258560 271333 307153 ...
## $ explicit : chr "False" "False" "False" "False" ...
## $ year : int 2000 1999 1999 2000 2000 1999 2000 2000 1999 2001 ...
## $ popularity : int 77 79 66 78 65 69 86 68 75 77 ...
## $ danceability : num 0.751 0.434 0.529 0.551 0.614 0.706 0.949 0.708 0.713 0.72 ...
## $ energy : num 0.834 0.897 0.496 0.913 0.928 0.888 0.661 0.772 0.678 0.808 ...
## $ key : int 1 0 7 0 8 2 5 7 5 6 ...
## $ loudness : num -5.44 -4.92 -9.01 -4.06 -4.81 ...
## $ mode : int 0 1 1 0 0 1 0 1 0 1 ...
## $ speechiness : num 0.0437 0.0488 0.029 0.0466 0.0516 0.0654 0.0572 0.0322 0.102 0.0379 ...
## $ acousticness : num 0.3 0.0103 0.173 0.0263 0.0408 0.119 0.0302 0.0267 0.273 0.00793 ...
## $ instrumentalness: num 1.77e-05 0.00 0.00 1.35e-05 1.04e-03 9.64e-05 0.00 0.00 0.00 2.93e-02 ...
## $ liveness : num 0.355 0.612 0.251 0.347 0.0845 0.07 0.0454 0.467 0.149 0.0634 ...
## $ valence : num 0.894 0.684 0.278 0.544 0.879 0.714 0.76 0.861 0.734 0.869 ...
## $ tempo : num 95.1 148.7 136.9 120 172.7 ...
## $ genre : chr "pop" "rock, pop" "pop, country" "rock, metal" ...
## /\ /\
## { `---' }
## { O O }
## ==> V <== No need for mice. This data set is completely observed.
## \ \|/ /
## `-----'
## artist song duration_ms explicit year popularity danceability energy key
## 2000 1 1 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0 0 0
## loudness mode speechiness acousticness instrumentalness liveness valence
## 2000 1 1 1 1 1 1 1
## 0 0 0 0 0 0 0
## tempo genre
## 2000 1 1 0
## 0 0 0
Widzimy, że nasz zestaw zawiera 2000 obserwacji, składa się z 18 kolumn. Ponadto możemy zauważyć, że zestaw nie posiada żadnych braków danych.
Niestety nazwy kolumn są w języku angielskim dlatego przed rozpoczęciem pracy z zestawem pozwolę sobię na ich przetłumaczenie co umożliwi łatwiejszą pracę w dalszej części.
colnames(utwory) <- c("Artysta", "Tytul_piosenki", "Czas_trwania",
"Wulgarnosc", "Rok_wydania", "Popularnosc",
"Tanecznosc", "Energicznosc", "Klucz", "Glosnosc",
"Skala", "Slowa_mowione", "Akustycznosc",
"Instrumentalnosc", "Na_zywo", "Pozytywnosc",
"BPM", "Gatunek")Następnie sprawdzamy czy w zestawie nie występują duplikaty tych samym piosenek, jeżeli tak to je usuwamy:
Zestaw zawiera niewielką ilość danych dla utworów z lat 1998 i 2020, które mogą wpływać na zależności pomiędzy zmiennymi, dlatego decyduję się na usunięcie ich z zestawu.
Ponadto wprowadzamy zmiany w zmiennych w zmiennych
Akustycznosc, Czas_trwania oraz
BPM.
utwory$Akustycznosc <- utwory$Akustycznosc * 100
utwory <- utwory %>%
mutate(Czas_trwania = Czas_trwania / 1000)
utwory$BPM <- round(utwory$BPM, 0)W kolejnej części tworzymy zmienną kategoryczną w zależności od
wartości pozytywności oraz zmieniamy pozostałe zmienne kategoryczne na
wartości typu factor.
utwory$Pozytywnosc_kat <- ifelse(utwory$Pozytywnosc >= 0.8, "Bardzo pozytywny",
ifelse(utwory$Pozytywnosc >= 0.6, "Pozytywny",
ifelse(utwory$Pozytywnosc >= 0.4, "Neutralny",
ifelse(utwory$Pozytywnosc >= 0.2, "Negatywny", "Bardzo negatywny"))))
utwory$Pozytywnosc_kat <- factor(utwory$Pozytywnosc_kat,
levels = c("Bardzo pozytywny",
"Pozytywny",
"Neutralny",
"Negatywny",
"Bardzo negatywny"))
utwory$Wulgarnosc <- ifelse(utwory$Wulgarnosc == "False", "Nie", "Tak")
utwory$Wulgarnosc <- factor(utwory$Wulgarnosc, levels = c("Nie", "Tak"))
utwory$Skala <- ifelse(utwory$Skala == 0, "Minor", "Major")
utwory$Skala <- factor(utwory$Skala, levels = c("Minor", "Major"))
utwory$Klucz <- factor(utwory$Klucz, levels = c(0:11))
utwory$Rok_wydania <- factor(utwory$Rok_wydania, levels = c(1999:2019))Ponadto decyduję się na usunięcie z zestawu kolumny
Na_zywo. Niestety dokumentacja dostępna na stronie, z
której pochodzi zestaw nie wyjaśnia w żaden sposób pochodzenia tych
wartości, dlatego w celu zapewnienia maksymalnej rzetelności swojej
pracy postanowiłem nie opierać swojej analizy na tej zmiennej.
Na sam koniec wprowadzam zmiany w zmiennej Popularnosc.
Do tej pory w zestawie mieliśmy do czynienia z małolicznymi danymi dla
wartości poniżej 40, dlatego pozbywam się ich z zestawu i dokonuje
odpowiednich obliczeń w celu przewartościowania pozostałych wartości na
przedział 0-100.
Spójrzmy jeszcze raz na strukturę zestawu i pierwsze kilka wierszy:
## 'data.frame': 1711 obs. of 18 variables:
## $ Artysta : chr "Britney Spears" "blink-182" "Faith Hill" "Bon Jovi" ...
## $ Tytul_piosenki : chr "Oops!...I Did It Again" "All The Small Things" "Breathe" "It's My Life" ...
## $ Czas_trwania : num 211 167 251 224 201 ...
## $ Wulgarnosc : Factor w/ 2 levels "Nie","Tak": 1 1 1 1 1 2 2 1 1 1 ...
## $ Rok_wydania : Factor w/ 21 levels "1999","2000",..: 2 1 1 2 2 1 2 2 1 3 ...
## $ Popularnosc : num 74 78 52 76 50 58 92 56 70 74 ...
## $ Tanecznosc : num 0.751 0.434 0.529 0.551 0.614 0.706 0.949 0.708 0.713 0.72 ...
## $ Energicznosc : num 0.834 0.897 0.496 0.913 0.928 0.888 0.661 0.772 0.678 0.808 ...
## $ Klucz : Factor w/ 12 levels "0","1","2","3",..: 2 1 8 1 9 3 6 8 6 7 ...
## $ Glosnosc : num -5.44 -4.92 -9.01 -4.06 -4.81 ...
## $ Skala : Factor w/ 2 levels "Minor","Major": 1 2 2 1 1 2 1 2 1 2 ...
## $ Slowa_mowione : num 0.0437 0.0488 0.029 0.0466 0.0516 0.0654 0.0572 0.0322 0.102 0.0379 ...
## $ Akustycznosc : num 30 1.03 17.3 2.63 4.08 11.9 3.02 2.67 27.3 0.793 ...
## $ Instrumentalnosc: num 1.77e-05 0.00 0.00 1.35e-05 1.04e-03 9.64e-05 0.00 0.00 0.00 2.93e-02 ...
## $ Pozytywnosc : num 0.894 0.684 0.278 0.544 0.879 0.714 0.76 0.861 0.734 0.869 ...
## $ BPM : num 95 149 137 120 173 122 105 103 138 126 ...
## $ Gatunek : chr "pop" "rock, pop" "pop, country" "rock, metal" ...
## $ Pozytywnosc_kat : Factor w/ 5 levels "Bardzo pozytywny",..: 1 2 4 3 1 2 2 1 2 1 ...
Możemy zauważyć, że nasza ostateczna wersja zestawu danych składa się z 1711 wierszy oraz 18 kolumn.
Skoro przygotowaliśmy dane, możemy przejść do omówienia znaczenia wartości każdej z kolumn:
Artysta - nazwa artysty.
Tytul_piosenki - tytuł utworu muzycznego.
Czas_trwania - czas trwania utworu wyrażony w
sekundach.
Wulgarnosc - zmienna opisująca czy dany utwór
zawiera treści wulgarne.
Rok_wydania - rok, w którym miała miejsce premiera
utworu.
Popularnosc - wartość określająca popularność utworu
w odniesieniu do pozostałych utworów w zestawie. Im wyższa wartość tym
bardziej popularny był utwór.
Tanecznosc - wartość określająca czy dany utwór
pasuje do tańca. Im wyższa wartość tym bardziej dany utwór jest
taneczny.
Energicznosc - wartość określająca w jakim stopniu
utwór jest energiczny. Im wyższa wartość tym bardziej dany utwór jest
energiczny.
Klucz - klucz muzyczny w jakim utwór został
skomponowany. Wartości odpowiadają poszczególnym gamom gdzie 0 oznacza
C, 1 oznacza C# i tak dalej aż do 11 oznaczającej H.
Glosnosc - jest to zmienna używana do pomiaru
głośności w cyfrowych systemach audio. Wartość 0 dB to największa
możliwa wartość głośności, jaką można reprezentować cyfrowo bez
zniekształceń. Wartości poniżej 0 dBFS oznaczają niższe poziomy
głośności w odniesieniu do tego maksimum. W praktyce im niższa wartość
tym cichszy dźwięk.
Skala - skala w jakiej został skomponowany utwór.
Skala minorowa oznacza utwory, które zwykle są smutniejsze podczas gdy
skala majorowa określa utwory radosne.
Slowa_mowione - określa stosunek mówionych słów do
pozostałych dźwięków w utworze. Utwory o wartości powyżej 0.33
najprawdopodobniej należą do gatunków takich jak rap.
Akustycznosc - wartość określająca akustyczność
danego utworu. Im wyższa wartość tym większa ilość dźwięków akustycznych
w utworze.
Instrumentalnosc - wartość określająca jaka część
utworu nie zawiera wokalu.
Pozytywnosc - wartość określająca charakter danego
utworu tzn. im wyższa wartość tym bardziej pozytywny jest dany utwór
(np. wesoły, radosny), a niższa świadczy o negatywności (np. smutny,
depresyjny).
BPM - tempo w jakim utwór został wykonany.
Gatunek - gatunek muzyczny utworu.
Pozytywnosc_kat - pozytywność danego utworu w
podziale na kategorie.
Po zapoznaniu się z zestawem danych możemy przejść do zasadniczej części EDA, w której postawimy sobie pytania, na które udzielimy odpowiedzi w dalszej częsci pracy. Poniższe pytania stanowią wyłącznie wstępny pomysł, który może się rozwijać w zależności od otrzymanych wyników. Na podstawie danych dotyczących najpopularniejszych utworów z lat 1999-2019 chciałbym przede wszystkim uzyskać odpowiedź na następujące pytania:
Którzy wykonawcy mają najwięcej hitów?
Które utwory były najpopularniejsze?
Jaki rodzaj muzyki jest najpopularniejszy?
Czy wraz z biegiem lat coraz więcej utworów zawiera treści wulgarne?
Czy wulgarność utworu wpływa na odczucia słuchaczy?
Czy istnieje jakaś zależność miedzy skalą lub kluczem, a popularnością?
Co wpływa na pozytywne odczucia słuchaczy?
W jaki sposób tempo utworu wpływa na chęć słuchaczy do tańca? Jakie inne cechy utworu na to wpływają?
Przechodzimy do szerszego zapoznania się z każdą ze zmiennych.
Zaczynamy od zmiennych kategorycznych i na początku omówimy sobie
Rok_wydania.
##
## 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014
## 38 66 100 83 85 87 94 82 84 87 78 90 81 99 68 82
## 2015 2016 2017 2018 2019
## 73 74 84 99 77
Jak widać wszystkie klasy są liczne i dzięki wcześniejszemu usunięciu danych dla lat 1998 i 2020 nie ma wartości odstających. Możemy to zwizualizować również za pomocą wykresu słupkowego poziomego.
utwory %>%
ggplot() +
geom_bar(aes(y = Rok_wydania),
color = "burlywood3",
fill = "burlywood1") +
theme_light() +
labs(title = "Ilość utworów w poszczególnych latach",
x = "Ilość utworów",
y = "Rok")Kolejną zmienną jest Wulgarnosc określająca zawartość
treści wulgarnych w utworze.
##
## Nie Tak
## 1230 481
Jak widać zdecydowana większość prezentowanych utworów nie zawiera
treści wulgarnych. Możemy to pokazać również na wykresie kołowym. W tym
celu korzystam z pakietu plotly.
Zmienna Klucz określa nam gamę w jakim został
skomponowany utwór. Gama utworu jest dobierana zależnie od preferencji
artysty i od tego w jakiej łatwiej mu wykonywać dany utwór, jednak
zależnościami dotyczącymi wyboru gamy zajmiemy się w dalszej części
analizy.
##
## 0 1 2 3 4 5 6 7 8 9 10 11
## 168 231 129 55 111 149 129 171 153 138 111 166
Jak widać ponownie mamy do czynienia z licznymi klasami, prezentujemy to również za pomocą wykresu słupkowego.
utwory %>%
ggplot() +
geom_bar(aes(y = Klucz),
color = "mistyrose3",
fill = "mistyrose") +
theme_light() +
labs(title = "Ilość utworów w danym kluczu muzycznym",
x = "Ilość utworów",
y = "Klucz")Kolejna zmienna kategoryczną jest Skala, cecha opisująca
w jakiej skali muzycznej został skomponowany utwór.
##
## Minor Major
## 770 941
Jak widać w większości mamy do czynienia z utworami wykonanymi w skali majorowej, a zatem możemy wyciągnąć wstępne wnioski, że do najpopularniejszych utworów należą przede wszystkim te o wesołej linii melodycznej. Ilość utworów w zależności od skali ponownie obrazuję za pomocą wykresu kołowego.
Ostatnią zmienną kategoryczną jest stworzona przeze mnie cecha
Pozytywnosc_kat określająca charakter danego utworu.
##
## Bardzo pozytywny Pozytywny Neutralny Negatywny
## 266 485 520 321
## Bardzo negatywny
## 119
Wszystkie klasy są liczne co prezentuję również za pomocą wykresu.
utwory %>%
ggplot() +
geom_bar(aes(x = Pozytywnosc_kat),
color = "lightskyblue",
fill = "lightskyblue1") +
theme_light() +
labs(title = "Ilość utworów w danych kategoriach pozytywności",
x = "Pozytywność",
y = "Ilość")Po omówieniu zmiennych kategorycznych przechodzimy do zaprezentowania
zmiennych ilościowych. Zaczynamy od zmiennej Popularnosc,
odzwierciedlającej popularność danego utworu w odniesieniu do
pozostałych w zestawie.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 38.00 54.00 52.73 68.00 98.00
Patrząc na kwartyle spodziewam się lekkiej asymetrii lewostronnej. W celu weryfikacji tworzę wykres gęstości.
utwory %>%
ggplot() +
geom_density(aes(x = Popularnosc),
color = "pink3",
fill = "pink") +
theme_light() +
labs(title = "Popularność utworów",
x = "Popularność",
y = "Gęstość")Kolejną zmienną ilościową jest zmienna Czas_trwania
opisująca długość utworu w sekundach.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 113.0 204.6 224.1 230.0 250.5 484.1
utwory %>%
ggplot() +
geom_boxplot(aes(x = Czas_trwania)) +
theme_light() +
labs(title = "Czas trwania utworów wyrażony w sekundach",
x = "Czas trwania")Otrzymujemy wartości odstające.
## 0% 10% 95% 100%
## 113.000 187.626 300.400 484.146
Jak widać tylko 10% utworów ma długość powyżej 5 minut.
Zmienna Tanecznosc określa czy dany utwór pasuje do
tańca.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.1770 0.5805 0.6760 0.6678 0.7655 0.9750
utwory %>%
ggplot() +
geom_histogram(aes(x = Tanecznosc),
bins = 10,
color = "wheat4",
fill = "wheat") +
theme_light() +
labs(title = "Taneczność utworów w skali 0 - 1",
x = "Taneczność",
y = "Ilość utworów")Jak widać zdecydowaną większość utworów możemy określić jako “nadające się” do tańca. Spójrzmy jednak jeszcze na kwantyle.
## 0% 1% 5% 15% 25% 50% 75% 100%
## 0.1770 0.3091 0.4205 0.5225 0.5805 0.6760 0.7655 0.9750
Jeśli założymy, że utwory mało taneczne charakteryzują się wartością mniejszą niż 0.4 wówczas możemy stwierdzić, że tylko niecałe 5% utworów nie są utworami, do których można się dobrze bawić na różnego rodzaju imprezach czy dyskotekach.
Kolejna zmienna to Energicznosc, która mówi nam o
stopniu energiczności danego utworu.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0549 0.6255 0.7390 0.7232 0.8425 0.9990
utwory %>%
ggplot() +
geom_density(aes(x = Energicznosc),
color = "lightskyblue4",
fill = "lightskyblue1") +
theme_light() +
labs(title = "Energiczność utworów w skali 0 - 1",
x = "Energiczność",
y = "Gęstość")Patrząc na wykres zdecydowanie możemy stwierdzić, że większość prezentowanych utwórów ma charakter energiczny.
Następną zmienną w zestawie jest zmienna Glosnosc. Jest
to wartość, którą posługują się producenci muzyczni oraz osoby
odpowiedzialne za mix i mastering utworu.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -20.514 -6.487 -5.265 -5.493 -4.142 -0.276
utwory %>%
ggplot() +
geom_histogram(aes(x = Glosnosc),
bins = 10,
color = "darkgreen",
fill = "lightgreen") +
theme_light() +
labs(title = "Głośność utworów w ramach masteringu (dB)",
x = "Głośność",
y = "Gęstość")Zdecydowanie większość utworów klasyfikuje się w przedziale od -10 do -1.
## 0% 1% 10% 25% 50% 75% 99% 100%
## -20.5140 -11.6549 -7.8660 -6.4875 -5.2650 -4.1420 -1.9721 -0.2760
Jak widać tylko 1% utworów ma głośność mniejszą od -11.
Zmienna Slowa_mowione odzwierciedla stosunek mówionych
słów do pozostałych dźwięków w utworze.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0232 0.0399 0.0613 0.1050 0.1310 0.5760
utwory %>%
ggplot() +
geom_density(aes(x = Slowa_mowione),
color = "lightgoldenrod4",
fill = "lightgoldenrod1") +
theme_light() +
labs(title = "Stosunek słów mówionych w utworze w skali 0 - 1",
x = "Słowa mówione",
y = "Gęstość")Na podstawie wykresu można powiedzieć, że tylko nieliczne utwory nie są śpiewane.
## 0% 50% 90% 95% 100%
## 0.0232 0.0613 0.2630 0.3315 0.5760
Możemy przyjąć, że tylko 5% utworów pochodzą prawdopodobnie z gatunku rap.
Kolejna zmienna to Akustycznosc określająca najprościej
mówiąc akustyczność danego utworu. Im wyższa wartość tym większa ilość
dźwięków akustycznych w utworze
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00206 1.41000 5.53000 12.74654 17.50000 97.60000
utwory %>%
ggplot() +
geom_density(aes(x = Akustycznosc),
color = "pink3",
fill = "pink") +
theme_light() +
labs(title = "Akustyczność utworów w utworze w skali 0 - 100",
x = "Akustyczność",
y = "Gęstość")Wykres gęstości dla zmiennej Akustycznosc jest dosyć
podobny jak dla zmiennej Slowa_mowione. Ponownie możemy
stwierdzić, że tylko nieliczne utwory w zestawie są akustyczne.
## 0% 50% 90% 95% 100%
## 0.00206 5.53000 34.90000 51.40000 97.60000
Jak widać tylko 5% utworów została stworzona przy użyciu dźwięków akustycznych, a co za tym idzie bez zastosowania syntezy elektronicznej.
Instrumentalnoscokreśla jaka część utworu nie zawiera
wokalu.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0000000 0.0000000 0.0000000 0.0145758 0.0000666 0.9850000
Ciężko jest coś powiedzieć o rozkładzie tej zmiennej dlatego posługuję się dodatkowo odpowiednimi kwantylami.
## 0% 50% 90% 95% 99% 100%
## 0.00000 0.00000 0.00372 0.02205 0.58230 0.98500
Tylko 1% utworów składa się w przynajmniej 50% z dzwięków bez wokalu, dlatego w dalszej części analizy nie będę się powoływał na tą zmienną.
Ostatnią zmienną ilościową jest BPM czyli zmienna, która
opisuje nam ilość uderzeń na minutę (tempo utworu).
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 60.0 98.0 120.0 120.3 135.0 211.0
utwory %>%
ggplot() +
geom_histogram(aes(x = BPM),
bins = 10,
color = "darkblue",
fill = "lightblue") +
theme_light() +
labs(title = "Ilość uderzeń na minutę w danym utworze (Tempo)",
x = "Tempo",
y = "Ilość")Jak widać większość utworu ma tempo w przedziale od 60 do 150. W celu wizualizacji rozkładu mogę również posłużyć się wykresem pudełkowym.
utwory %>%
ggplot() +
geom_boxplot(aes(x = BPM)) +
theme_light() +
labs(title = "Ilość uderzeń na minutę w danym utworze (Tempo)",
x = "Tempo") ## 0% 25% 50% 75% 90% 99% 100%
## 60 98 120 135 160 192 211
Można zauważyć, że tylko niecały 1% utworów ma tempo powyżej 200 natomiast 10% utworów możemy sklasyfikować jako bardzo szybkie ponieważ ich BPM przekracza 160.
Na samym początku postaram się odpowiedzieć na pytanie: Którzy wykonawcy mają najwięcej hitów? W tym celu muszę odpowiednio przygotować dane grupując je w zależności od artysty.
artysci <- utwory %>%
select(Artysta) %>%
group_by(Artysta) %>%
summarize(Ilosc = n()) %>%
arrange(desc(Ilosc)) %>%
slice(1:20) %>%
print(n = Inf)## # A tibble: 20 × 2
## Artysta Ilosc
## <chr> <int>
## 1 Rihanna 23
## 2 Eminem 20
## 3 Calvin Harris 19
## 4 Drake 19
## 5 Britney Spears 18
## 6 David Guetta 18
## 7 Beyoncé 16
## 8 Chris Brown 15
## 9 Kanye West 15
## 10 Katy Perry 15
## 11 Black Eyed Peas 14
## 12 Taylor Swift 13
## 13 JAY-Z 12
## 14 Bruno Mars 11
## 15 Coldplay 11
## 16 Jason Derulo 11
## 17 Justin Timberlake 11
## 18 Nelly 11
## 19 P!nk 11
## 20 Flo Rida 10
Następnie przygotowane dane przenoszę na wykres słupkowy.
artysci %>%
ggplot() +
geom_bar(aes(x = reorder(Artysta, -Ilosc), y = Ilosc),
stat = "identity",
color = "peachpuff4",
fill = "peachpuff") +
theme_light() +
labs(title = "Ilość utworów danego artysty",
x = "Artysta",
y = "Ilość utworów") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Jak widać na przestrzeni lat 1999-2019 artystami o największej ilości popularnych utworów byli:
Rihanna
Eminem
Calvin Harris
Poznaliśmy artystów z największą ilością hitów. Zastanówmy się teraz, które utwory były jednak najpopularniejsze. Ponownie zaczynamy od odpowiedniego przygotowania danych sortując po popularności i wybierając pierwsze 20.
popularne <- utwory %>%
select(Tytul_piosenki, Popularnosc) %>%
arrange(desc(Popularnosc)) %>%
slice(1:20)Przenosimy dane na wykres kolumnowy.
popularne %>%
ggplot() +
geom_bar(aes(x = reorder(Tytul_piosenki, -Popularnosc), y = Popularnosc),
stat = "identity",
color = "darkgreen",
fill = "lightgreen") +
theme_light() +
labs(title = "Najpopularniejsze utwory muzyczne",
x = "Tytuł",
y = "Popularność utworu") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Jak widać mamy wiele utworów o podobnym poziomie popularności jednak na podstawie uzyskanych wyników możemy powiedzieć, że najpopularniejsze utwory w latach 1999-2019 to:
Sweater Weather
Another Love
Without Me
Znamy już najpopularniejszych artystów i najpopularniejsze utwory. Zastanówmy się jednak, jaki gatunek muzyczny był najpopularniejszy w latach 1999-2019. W tym celu grupuję dane po gatunku muzycznym.
najpopularniejsze <- utwory %>%
select(Gatunek) %>%
group_by(Gatunek) %>%
summarize(Ilosc = n()) %>%
arrange(desc(Ilosc)) %>%
print(n = Inf)## # A tibble: 56 × 2
## Gatunek Ilosc
## <chr> <int>
## 1 pop 356
## 2 hip hop, pop 253
## 3 hip hop, pop, R&B 211
## 4 pop, Dance/Electronic 171
## 5 pop, R&B 153
## 6 hip hop 109
## 7 hip hop, pop, Dance/Electronic 66
## 8 rock 52
## 9 Dance/Electronic 36
## 10 rock, metal 36
## 11 rock, pop 35
## 12 pop, latin 24
## 13 pop, rock 23
## 14 set() 21
## 15 hip hop, Dance/Electronic 13
## 16 latin 13
## 17 R&B 12
## 18 hip hop, pop, latin 12
## 19 pop, rock, metal 12
## 20 metal 9
## 21 pop, rock, Dance/Electronic 9
## 22 country 8
## 23 hip hop, pop, rock 8
## 24 pop, country 8
## 25 pop, Folk/Acoustic 7
## 26 pop, R&B, Dance/Electronic 6
## 27 rock, pop, Dance/Electronic 6
## 28 rock, pop, metal 4
## 29 hip hop, R&B 3
## 30 hip hop, pop, R&B, Dance/Electronic 3
## 31 Folk/Acoustic, pop 2
## 32 World/Traditional, pop, Folk/Acoustic 2
## 33 World/Traditional, rock 2
## 34 pop, easy listening, jazz 2
## 35 pop, rock, Folk/Acoustic 2
## 36 rock, blues, latin 2
## 37 Folk/Acoustic, rock, pop 1
## 38 World/Traditional, Folk/Acoustic 1
## 39 World/Traditional, hip hop 1
## 40 World/Traditional, pop 1
## 41 easy listening 1
## 42 hip hop, country 1
## 43 hip hop, latin, Dance/Electronic 1
## 44 hip hop, pop, R&B, latin 1
## 45 hip hop, pop, country 1
## 46 hip hop, rock, pop 1
## 47 pop, R&B, easy listening 1
## 48 pop, easy listening, Dance/Electronic 1
## 49 rock, Dance/Electronic 1
## 50 rock, Folk/Acoustic, easy listening 1
## 51 rock, Folk/Acoustic, pop 1
## 52 rock, R&B, Folk/Acoustic, pop 1
## 53 rock, blues 1
## 54 rock, classical 1
## 55 rock, easy listening 1
## 56 rock, pop, metal, Dance/Electronic 1
Otrzymane dane przenoszę na wykres.
najpopularniejsze %>%
filter(Ilosc > 10) %>%
ggplot() +
geom_bar(aes(x = reorder(Gatunek, -Ilosc), y = Ilosc),
stat = "identity",
color = "darkblue",
fill = "lightblue") +
theme_light() +
labs(title = "Popularność utworów ze względu na gatunek",
x = "Gatunek",
y = "Ilość utworów") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))Otrzymany wykres pokazuje, że na przestrzeni lat 1999-2019 najpopularniejszymi gatunkami muzycznymi były wszelkie odmiany popu w połączeniu z hip hopem.
W kolejnym pytaniu chciałbym się zastanowić nad tym czy na przestrzeni lat możemy zaobserować coraz większą ilość treści wulgarnych w utworach muzycznych. W tym celu rozważę stosunek utworów wulgarnych do wszystkich utworów w danym roku kalendarzowym. Rozpoczynam od stworzenia wektora z ilością utworów na dany rok.
## [1] 38 66 100 83 85 87 94 82 84 87 78 90 81 99 68 82 73 74 84
## [20] 99 77
Następnie tworzę zestaw danych zawierających wyłącznie ilość utworów z treściami wulgarnymi w danym roku.
wlg_lata <- utwory %>%
filter(Wulgarnosc == "Tak") %>%
select(Rok_wydania, Wulgarnosc) %>%
group_by(Rok_wydania) %>%
summarize(Ilosc = n()) %>%
print(n = Inf)## # A tibble: 21 × 2
## Rok_wydania Ilosc
## <fct> <int>
## 1 1999 8
## 2 2000 12
## 3 2001 23
## 4 2002 28
## 5 2003 22
## 6 2004 31
## 7 2005 26
## 8 2006 23
## 9 2007 21
## 10 2008 20
## 11 2009 22
## 12 2010 20
## 13 2011 22
## 14 2012 18
## 15 2013 14
## 16 2014 14
## 17 2015 22
## 18 2016 25
## 19 2017 28
## 20 2018 47
## 21 2019 35
Na podstawie stosunku tworzę wykres.
wlg_lata %>%
ggplot(aes(x = Rok_wydania, y = Ilosc / wulgarne)) +
geom_line(aes(group = 1),
linewidth = 0.3,
color = "red") +
geom_point(size = 3) +
theme_light() +
labs(title = "Stosunek ilości utworów wulgarnych do ilości utworów",
x = "Rok",
y = "Stosunek") +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) Na podstawie wykresu możemy stwierdzić, że od 2014 roku obserwujemy wzrost treści wulgarnych.
Poprzednie pytanie pozwoliło na określenie czy mamy do czynienia z coraz większą ilością treści wulgarnych. Uzyskaliśmy odpowiedź twierdzącą, wobec tego zastanowię się czy wulgarne treści przekładają się na odbiór słuchaczy - czy treści wulgarne wpływają na pozytywność utworu.
Tworzę wykres kolumnowy dla utworów z treścią wulgarną w zależności od kategorii pozytywności.
utwory %>%
filter(Wulgarnosc == "Tak") %>%
ggplot() +
geom_bar(aes(x = Wulgarnosc, fill = Pozytywnosc_kat),
color = "black",
position = "dodge2") +
theme_light() +
labs(title = "Wulgarność utworu, a jego pozytywność",
x = "Wulgarność",
y = "Liczba utworów",
fill = "Pozytywność utworów") +
theme(axis.text.x = element_blank())Jak widać wulgarność utworu nie przekłada się na negatywny odbiór, czego wstępnie można było się spodziewać. Wyznaczmy jednak średnią pozytywności dla utworów wulgarnych i niewulgarnych, żeby móc to lepiej zaobserwować.
utwory %>%
select(Wulgarnosc, Pozytywnosc) %>%
group_by(Wulgarnosc) %>%
summarize(ŚREDNIA = mean(Pozytywnosc))Rzeczywiście na podstawie otrzymanej statystyki możemy stwierdzić, że wulgarność utworów muzycznych zupełnie nie wpływa na odbiór słuchaczy.
Przechodzimy do głębszej analizy poszczególnych zależności między zmiennymi. W kolejnej części odpowiem na pytanie: Czy istnieje jakaś zależność miedzy skalą lub kluczem, a popularnością?
Żeby móc odpowiedzieć na to pytanie wpierw spójrzmy jak wygląda rozkład liczby utworów w zależności od klucza i skali.
Będę chciał stworzyć wykres kolumnowy w podziale na skalę, gdzie
kolor będzie określany przez Klucz. W tym celu muszę
najpierw stworzyc wektor 12 kolorów. Wykorzystuję do tego pakiet
RColorBrewer.
Następnie stworzony wektor kolorów wykorzystuję do zbudowania wykresu.
utwory %>%
ggplot() +
geom_bar(aes(x = Skala, fill = Klucz),
color = "white",
position = "dodge2") +
theme_light() +
scale_fill_manual(values = paleta) +
labs(title = "Ilość utworów w skali w zależności od klucza",
x = "Skala",
y = "Ilość")Widzimy, że w skali minorowej dominują gamy:
H
F
C#
Oraz w skali majorowej:
C#
G
C
Wynika to najprawdopodobniej z uwagi na to, że w tych gamach większości artystów łatwiej jest tworzyć utwory wokalne, które są skierowane do szerokiej publiki.
Zastanówmy się zatem, czy popularność utworów zmienia się w zależności od skali. Wobec tego tworzymy wykresy gęstości.
utwory %>%
ggplot() +
geom_density(aes(x = Popularnosc),
color = "darkblue",
fill = "lightblue") +
facet_wrap(~ Skala, nrow = 2)+
theme_light() +
labs(title = "Popularność utworów w zależności od skali",
x = "Popularność",
y = "")Wykresy wspieramy dodatkowo statystykami opisowymi.
utwory %>%
select(Skala, Popularnosc) %>%
group_by(Skala) %>%
summarize(ŚREDNIA = mean(Popularnosc),
MINIMUM = min(Popularnosc),
MAKSIMUM = max(Popularnosc))Na podstawie wykresu i statystyk opisowych możemy stwierdzić, że popularność nie zależy od skali utworu.
Może jednak istnieje związek pomiędzy popularnością utworu, a kluczem w którym został skomponowany. Ponownie tworzymy odpowiednie wykresy i statystyki opisowe.
utwory %>%
ggplot() +
geom_density(aes(x = Popularnosc),
color = "darkgreen",
fill = "lightgreen") +
facet_wrap(~ Klucz, ncol = 3) +
theme_light() +
labs(title = "Popularność utworów w zależności od skali",
x = "Popularność",
y = "")utwory %>%
select(Klucz, Popularnosc) %>%
group_by(Klucz) %>%
summarize(ŚREDNIA = mean(Popularnosc),
MEDIANA = median(Popularnosc),
ODCHYLENIE = sd(Popularnosc))Jak widać średnie wartości praktycznie nie różnią się od siebie, jednak odchylaja się w najmniejszy sposób dla gamy 8 czyli G#, a najbardziej dla gamy 10 czyli A#.
Mimo to nie są to znaczne różnice, więc nie możemy jednoznacznie stwierdzic o dużej zależności pomiędzy popularnością, a kluczem lub skalą utworu.
Kolejna część zostanie poświęcona pytaniu: Co wpływa na pozytywne odczucia słuchaczy? W tym celu na samym początku tworzę macierz korelacji wyznaczając wsp. korelacji rang Spearmana, a następnie odpowiednio to wizualizuję.
korelacje <- cor(utwory[, c("Czas_trwania", "Popularnosc", "Tanecznosc", "Energicznosc",
"Glosnosc", "Slowa_mowione", "Akustycznosc", "Instrumentalnosc",
"BPM", "Pozytywnosc")],
method = "spearman")
round(korelacje, 2)## Czas_trwania Popularnosc Tanecznosc Energicznosc Glosnosc
## Czas_trwania 1.00 -0.11 -0.03 -0.10 -0.11
## Popularnosc -0.11 1.00 0.00 -0.09 0.03
## Tanecznosc -0.03 0.00 1.00 -0.17 -0.07
## Energicznosc -0.10 -0.09 -0.17 1.00 0.61
## Glosnosc -0.11 0.03 -0.07 0.61 1.00
## Slowa_mowione 0.02 0.00 0.24 0.03 -0.02
## Akustycznosc 0.04 0.07 0.10 -0.35 -0.19
## Instrumentalnosc 0.00 -0.09 0.05 0.09 -0.10
## BPM -0.04 0.02 -0.14 0.17 0.08
## Pozytywnosc -0.12 -0.10 0.40 0.30 0.20
## Slowa_mowione Akustycznosc Instrumentalnosc BPM Pozytywnosc
## Czas_trwania 0.02 0.04 0.00 -0.04 -0.12
## Popularnosc 0.00 0.07 -0.09 0.02 -0.10
## Tanecznosc 0.24 0.10 0.05 -0.14 0.40
## Energicznosc 0.03 -0.35 0.09 0.17 0.30
## Glosnosc -0.02 -0.19 -0.10 0.08 0.20
## Slowa_mowione 1.00 0.07 -0.16 0.01 0.13
## Akustycznosc 0.07 1.00 -0.19 -0.16 -0.03
## Instrumentalnosc -0.16 -0.19 1.00 0.08 0.01
## BPM 0.01 -0.16 0.08 1.00 -0.03
## Pozytywnosc 0.13 -0.03 0.01 -0.03 1.00
Widzimy wysoką zależność pomiędzy zmiennymi Pozytywnosc,
a Tanecznosc. Przyjrzyjmy się tej zależności za pomocą
wykresu punktowego.
utwory %>%
ggplot() +
geom_point(aes(x = Tanecznosc, y = Pozytywnosc),
size = 2,
color = "darkgreen",
alpha = 0.3) +
theme_light() +
labs(title = "Związek między pozytywnością i tanecznością utworu",
x = "Taneczność",
y = "Pozytywność")Widzimy, że faktycznie im bardziej utwór jest taneczny, tym bardziej przekłada się na pozytywny odbiór słuchaczy.
Ponadto tablica korelacji sugeruje nam zależność ze zmienną
Energicznosc. Przyjrzyjmy się tej zależności za pomocą
wykresów pudełkowych w zależności od kategorii pozytywności.
utwory %>%
ggplot() +
geom_boxplot(aes(x = reorder(Pozytywnosc_kat, Energicznosc), y = Energicznosc)) +
theme_light() +
labs(title = "Pozytywność utworu, a jego energiczność",
x = "Pozytywność",
y = "Energiczność")Ponownie możemy stwierdzić, że im bardziej utwór jest energiczny tym bardziej pozytywnie jest odbierany.
Oprócz bezpośredniego związku ze zmienna Pozytywnosc,
możemy również zauważyć silną zależność między zmiennymi
Glosnosc, a Energicznosc, która wykazaliśmy,
że jest również powiązana ze zmienną Pozytywnosc.
utwory %>%
ggplot() +
geom_point(aes(x = Glosnosc, y = Energicznosc),
size = 2,
color = "darkblue",
alpha = 0.2) +
theme_light() +
labs(title = "Związek między głośnością i energicznością utworu",
x = "Głośność",
y = "Energiczność")Ten sam związek pokażmy w zależności od kategorii pozytywności.
utwory %>%
ggplot() +
geom_point(aes(x = Glosnosc, y = Energicznosc, color = Pozytywnosc_kat),
size = 2) +
theme_light() +
scale_color_manual(values = c("magenta4", "orchid", "mistyrose", "lightgreen", "darkgreen")) +
labs(title = "Pozytywność utworu w zależności od głośności i energiczności",
x = "Głośność",
y = "Energiczność",
color = "Pozytywność")Wykres wyraźnie prezentuje zależność między zmiennymi
Pozytywnosc i Glosnosc. Dodatkowo wyznaczmy
jeszcze statystyki opisowe.
utwory %>%
select(Pozytywnosc_kat, Glosnosc) %>%
group_by(Pozytywnosc_kat) %>%
summarize(ŚREDNIA = mean(Glosnosc),
MEDIANA = median(Glosnosc),
ODCHYLENIE = sd(Glosnosc),
MINIMUM = min(Glosnosc),
MAKSIMUM = max(Glosnosc))Widzimy, że im niższa wartość zmiennej Glosnosc tym
większa pozytywność utworu. Oznacza to, że głośniejsze utwory maja
bezpośrednie przełożenie na pozytywny odbiór muzyki, w przeciwieństwie
do cichych.
Na sam koniec spójrzmy jeszcze w jaki sposób długość utworu wpływa na jego odbiór.
utwory %>%
ggplot() +
geom_boxplot(aes(x = Pozytywnosc_kat, y = Czas_trwania)) +
theme_light() +
labs(title = "Czas trwania w zależności od kategorii pozytywności",
x = "Pozytywność",
y = "Czas trwania")Możemy zaobserwować, że nie ma tutaj dużych zależności, jednak jesteśmy w stanie powiedzieć, że dłuższe utwory negatywnie wpływają na odbiór.
Skupmy się jeszcze na zmiennej Tanecznosc i zastanówmy
się czy istnieją jakieś zależności z innymi zmiennymi. Zacznijmy od
analizy zależności tempem utworu.
utwory %>%
ggplot() +
geom_point(aes(x = Tanecznosc, y = BPM),
color = "lightsalmon4",
alpha = 0.4) +
theme_light() +
labs(title = "Zależność między tempem, a tanecznością",
x = "Taneczność",
y = "BPM")Na podstawie wykresu możemy stwierdzić, że najchętniej słuchacze tańczą do muzyki o tempie w przedziale około 90-130 uderzeń na minutę.
Zastanówmy się zatem, czy większa chęć do tańca wiąże się bezpośrednio z mniej energicznymi utworami, czy może jednak istnieje tendencja do tańczenia przy muzyce znacznie dynamicznej.
utwory %>%
ggplot() +
geom_point(aes(x = Tanecznosc, y = Energicznosc),
color = "deeppink4",
alpha = 0.4) +
theme_light() +
labs(title = "Związek między tanecznością i energicznością utworu",
x = "Taneczność",
y = "Energiczność")Możemy wyciągnąć wnioski, że faktycznie im bardziej energiczny utwór, tym większa chęć do tańca wśród słuchaczy.
Na sam koniec spójrzmy jeszcze raz na zależności pomiędzy tanecznością, a pozytywnością utworu. Tym razem rozważmy analizę wykresów pudełkowych.
utwory %>%
ggplot() +
geom_boxplot(aes(x = reorder(Pozytywnosc_kat, Tanecznosc), y = Tanecznosc)) +
theme_light() +
labs(title = "Związek między pozytywnością i tanecznością utworu",
x = "Pozytywność",
y = "Taneczność")Widzimy, że zasadniczo utwory pozytywne, czyli takie, które są
odbierane jako wesołe i radosne zdecydowanie mają wpływ na zmienną
Tanecznosc. Im bardziej pozytywny charakter utworu, tym
większa chęć do tańca słuchaczy.
Powyższa analiza danych sprawiła mi wiele przyjemności oraz jednocześnie pozwoliła na pogłębienie wiedzy i umiejętności w zakresie formatowania, odpowiedniego selekcjonowania, a także wizualizowania danych.
Dowiedziałem się wielu ciekawych rzeczy jak np. informacje dotyczące najpopularniejszych artystów czy utworów z lat 1999-2019. Ponadto ku wielkiemu zdziwieniu zobaczyłem, że treści wulgarne nie wpływają na odbiór utworu przez słuchaczy. Oprócz stricte wniosków płynących z analizy wykresów i statystyk, poprzez długie przygotowania dowiedziałem się wielu informacji dotyczących skal i gam muzycznych, w których komponuje się utwory. Przygotowany zestaw pozwolił mi również zrozumieć i poznać wartości wpływające na charakter pozytywności danego utworu oraz cechy warunkujące chęć słuchaczy do tańca.
Projekt eksploracyjnej analizy danych umożliwił mi zgłębienie wiedzy nie tylko na płaszczyźnie statystyki, programowania w języku R, ale również na płaszczyźnie życia codziennego. Wierzę, że zdobyte umiejętności zostaną ze mną na długo i w przyszłości jeszcze będę miał okazję je wykorzystać.